设置用户过滤器

设置用户过滤器

package com.imooc.web.filter;


import java.io.IOException;


import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;


import com.imooc.domain.User;


@WebFilter(value={"/admin/*"})

public class UserFilter implements Filter {


public void destroy() {

}


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

// 获得session进行判断

HttpServletRequest req = (HttpServletRequest) request;

User existUser = (User) req.getSession().getAttribute("existUser");

if(existUser == null){

// 没有登录:

request.setAttribute("msg", "您还没有登录,没有权限访问!");

request.getRequestDispatcher("/login.jsp").forward(req, response);

return;

}

chain.doFilter(request, response);

}


public void init(FilterConfig fConfig) throws ServletException {

}


}


但是请求转发后

http://img1.sycdn.imooc.com//climg/5ed0b5fe09d9403904210271.jpg

没有样式 

如果点击 登录和 注册的话

样式又不会出现问题

http://img1.sycdn.imooc.com//climg/5ed0b6400915202505190421.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,是的。没有被拦截,是因为转发是服务器端请求jsp,不是客户端请求jsp,所以不会拦截。设置过滤器拦截所有请求是其中一种拦截方式,这样可以更好的控制用户访问权限。在开发的时候,要根据项目和业务需求配置过滤器,决定是否要拦截所有请求。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

提问者 万象天心 2020-05-30 10:00:50

http://img1.sycdn.imooc.com//climg/5ed1bdbc09800dc602650350.jpg

我的文件是这么设置的,用户过滤器拦截的是/admin/*

我直接访问/admin/中的jsp是会被拦截的

但是在Servlet中请求转发到/admin/中的jsp,却没有被拦截

  • 同学你好,同学可以配置/*,表示拦截所有请求。再在过滤器中对一些请求放行。祝学习愉快~
    2020-05-30 10:43:27
  • 提问者 万象天心 回复 好帮手慕阿慧 #2
    老师 我想先知道 这是为什么, 是因为请求转发中的请求还是原请求,所以不会触发 过滤器么。 除此之外 我们在开发的时候,设置过滤器都是拦截所有请求,然后再对一些请求放行 么
    2020-05-30 10:56:53
好帮手慕阿慧 2020-05-30 09:33:52

同学你好,如果jsp文件放在WEB-INF下,则需要通过Servlet转发到jsp页面,不会有漏洞。如果不是,同学可以在UserFilter过滤器中设置要对哪些jsp页面和Servlet放行。

参考代码如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
		throws IOException, ServletException {
	String str = ((HttpServletRequest) request).getRequestURI().toString();
	if (str.indexOf(".css") > 0 || str.indexOf(".jpg") > 0 || str.indexOf(".png") > 0 || str.indexOf("login") > 0||str.indexOf("KaptchaServlet")>0||str.indexOf("LoginServlet")>0) {
		chain.doFilter(request, response);
		return;
	}
	User user = (User) ((HttpServletRequest) request).getSession().getAttribute("existUser");
	if (user == null || "".equals(user)) {
		// 未登录
		request.setAttribute("msg", "用户未登陆");
		((HttpServletResponse) response)
			.sendRedirect(((HttpServletRequest) request).getContextPath() + "/login.jsp");
		return;
	} else {
		chain.doFilter(request, response);
		return;
	}
}

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


好帮手慕阿慧 2020-05-29 18:35:31

同学你好,建议同学将CSS文件的路径改为绝对路径试试。

参考代码如下:

http://img1.sycdn.imooc.com//climg/5ed0e5660989b29206410050.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 万象天心 #1
    谢谢老师 这个问题解答了 还有一个问题 我设置了过滤器,如果直接输入地址是无法访问/admin里的jsp文件,但是可以在Servlet里通过请求转发,转到jsp页面里,这样是不是有漏洞 那应该怎么解决呢,如果给MessageServlet加过滤器,那么未登录时不就无法显示所有留言了么
    2020-05-29 19:30:27
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师