jsp中添加过滤器,实现校验用户身份
我现在需要实现一个功能,就是用户登录前不允许访问系统,我使用的是jsp的过滤器来实现的。
先把filter过滤器的代码粘出来:
1 package com.day8.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.annotation.WebFilter; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpSession; 14 15 @WebFilter("/*") 16 public class CheckFilter implements Filter { 17 18 public CheckFilter() { 19 } 20 21 public void destroy() { 22 } 23 24 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 25 HttpServletRequest req = (HttpServletRequest)request; 26 27 if(!req.getServletPath().equals("/login")) { 28 HttpSession session = req.getSession(); 29 String managername = (String)session.getAttribute("username"); 30 if(managername==null) { 31 req.setAttribute("msg", "没有权限"); 32 req.getRequestDispatcher("error.jsp").forward(request, response); 33 return; 34 } 35 } 36 37 chain.doFilter(request, response); 38 } 39 40 public void init(FilterConfig fConfig) throws ServletException { 41 } 42 43 }
主要代码在第24-第38行
这里是实现了一个通用的过滤器,对所有的请求都会用这个过滤器进行过滤,这就出现了一个问题,会把不需要过滤的页面也进行过滤,这时就需要排除不需要过滤的请求,我这里是把登录请求login进行了排除
校验用户身份是检查session是否存在,如果不存在,就认为用户身份不合法,这时候就请求转发到error.js页面,给出错误的提示
注意第33行,这里添加了一个return,停止后面代码的执行,不然请求转发后,后面还有代码需要执行,会导致报错:Cannot forward after response has been committed
下面我再把error.jsp的代码贴出来:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> ${error } <a href="login">返回</a> </body> </html>