过滤器的用法
我们的网站需要账户才能登陆,但如果我们直接在url中输入请求,能不能访问到资源呢?不采取任何过滤措施的话,任何人都能进入我们的管理页面是一件很恐怖的事情。
首先打开web.xml
,添加下列配置
<filter>
<filter-name>loginfilter</filter-name>
<filter-class>com.zhongruan.filter.LoginFilter</filter-class>
</filter>
<!-- 过滤器的映射 -->
<filter-mapping>
<filter-name>loginfilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
这时我们就配置好了一个过滤器,它会拦截所有.do
的请求(你也可以自定义成别的),发送给filter-class
中的处理函数
再看一下我们的过滤器
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器执行====");
// 1. 得到HttpServletRequest
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 2. 得到session
HttpSession session = request.getSession();
// 3. 得到User对象
User user = (User) session.getAttribute("user");
// 4. 得到请求路径
String url = request.getRequestURI();
// 5. 判断session是否存在user对象 如果存在 表示已登录 不存在 则未登录 indexOf
// indexOf 方法的作用 如果包含子字符串 则返回 子字符串的索引 如果不包含 则返回 -1
if (user == null && url.indexOf("login.do") == -1) {
System.out.println("登录信息不存在, 并且访问登录接口以外的其他接口,应进行拦截");
response.sendRedirect(request.getContextPath() + "/pages/login.jsp");
} else {
// 过滤器的放行
System.out.println("登录信息已存在");
filterChain.doFilter(servletRequest, servletResponse);
}
}
他是通过session中的user是否存在来判断的,当user不存在时只能访问到login界面,再看一下login函数
@RequestMapping("/login.do")
public String login(String username, String password, HttpSession session) {
System.out.println(username + "====" + password);
// 对 用户名和密码 进行 校验
User user = userService.login(new User(username, password));
System.out.println(user);
if (user == null) {
System.out.println("登录失败");
return "pages/failer";
} else {
// 将user对象 存储到 session中
session.setAttribute("user", user);
// 7.26 查询用户角色
List<Integer> list = roleService.findRoleId(user.getId());
session.setAttribute("roleIds", list);
System.out.println("登录成功");
return "pages/success";
}
}
如果成功登录,就将user添加到session中,这样我们就实现了一个简单的登录过滤器