登录后才能访问一些页面,用过滤器实现(进行登录后才能用的操作之前系统都要自行认证身份)

    1. package util;
    2. import domain.User;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.http.HttpFilter;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.io.IOException;
    10. public class LoginFilter extends HttpFilter implements Filter {
    11. @Override
    12. protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
    13. //先排除不需要认证的请求
    14. //自行登录操作不需要认证(需要用户手动认证)还有*.js *.jpg *.css
    15. // request.getRequestURL();// http://localhost:8080/qxgl/login.view
    16. // request.getRequestURI();// /qxgl/login.view
    17. // request.getContextPath();// /qxgl工程名
    18. String path = request.getServletPath();//获得此次请求 login.view
    19. System.out.println("path:"+path);
    20. if(path.contains("login")||(path.contains(".js")&&(!path.contains(".jsp")))||path.contains(".css")||path.contains(".jpg")){
    21. //不需要认证,放过此次请求,继续请求目标
    22. chain.doFilter(request,response);//放行
    23. return;
    24. }
    25. //其余请求做登录认证
    26. User user=(User) request.getSession().getAttribute("loginUser");
    27. if(user==null){
    28. //需要认证,但发现还没有登录
    29. response.sendRedirect("http://localhost:8080/qxgl07/login.jsp");
    30. }else {
    31. //需要认证,且认证通过,放过请求,继续访问目标
    32. chain.doFilter(request,response);
    33. }
    34. }
    35. }

    image.png

    添加自动登录功能
    将账号密码以及此次用户请求的一些信息存储在服务端
    用户本身的信息
    用户访问的ip信息(mac)
    用户浏览器信息
    并为之生成一个令牌,将令牌随着cookie响应给浏览器,浏览器每次请求时都会传递cookie(令牌)
    每次请求前都要验证一下:是否需要自动登录,是否已经登陆**

    1. package util;
    2. import domain.Token;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.http.Cookie;
    7. import javax.servlet.http.HttpFilter;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import java.io.IOException;
    11. //自动登录过滤器
    12. public class AutoLoginFilter extends HttpFilter implements Filter {
    13. @Override
    14. protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
    15. String path = request.getServletPath();
    16. if ((path.endsWith(".js")) || path.contains(".css") || path.contains(".jpg")) {
    17. //不需要认证,放过此次请求,继续请求目标
    18. chain.doFilter(request, response);//放行
    19. return;
    20. }
    21. Cookie[] cookies = request.getCookies();
    22. if (cookies != null && cookies.length > 0) {//有cookie
    23. for (Cookie c : cookies) {
    24. String name = c.getName();
    25. String value = c.getValue();//tokenId值
    26. if ("tokenId".equals(name)) {
    27. //value==uuid,有自动登录处理
    28. Token token = (Token) request.getServletContext().getAttribute(value);
    29. if (token == null) {
    30. //伪造的tokenId,不能自动登录
    31. chain.doFilter(request, response);
    32. return;
    33. } else if (!token.getIp().equals(request.getRemoteAddr())) {//ip地址不一样
    34. chain.doFilter(request, response);
    35. return;
    36. } else if (token.getEnd() < System.currentTimeMillis()) {//已经超过自动登录时效
    37. chain.doFilter(request, response);
    38. return;
    39. } else {//符合自动登录条件
    40. request.getSession().setAttribute("loginUser", token.getUser());
    41. if (path.contains("login.jsp")) {//此次请求正要访问登录页,但已经实现自动登录,所以直接跳转到主界面
    42. response.sendRedirect("http://localhost:8080/qxgl07/main.jsp");
    43. return;
    44. }
    45. chain.doFilter(request, response);
    46. return;
    47. }
    48. }
    49. }
    50. }
    51. chain.doFilter(request, response);
    52. }
    53. }
    1. package domain;
    2. //自动登录的令牌验证信息
    3. public class Token {
    4. private String token;//uuid
    5. private User user;
    6. private String ip;
    7. private long start;//生效时间戳,单位为毫秒
    8. private long end;//失效时间戳
    9. public Token() {}
    10. public Token(String token, User user, String ip, long start, long end) {
    11. this.token = token;
    12. this.user = user;
    13. this.ip = ip;
    14. this.start = start;
    15. this.end = end;
    16. }
    17. public String getToken() {
    18. return token;
    19. }
    20. public User getUser() {
    21. return user;
    22. }
    23. public String getIp() {
    24. return ip;
    25. }
    26. public long getStart() {
    27. return start;
    28. }
    29. public long getEnd() {
    30. return end;
    31. }
    32. public void setToken(String token) {
    33. this.token = token;
    34. }
    35. public void setUser(User user) {
    36. this.user = user;
    37. }
    38. public void setIp(String ip) {
    39. this.ip = ip;
    40. }
    41. public void setStart(long start) {
    42. this.start = start;
    43. }
    44. public void setEnd(long end) {
    45. this.end = end;
    46. }
    47. }

    image.png

    1. //自动登录实现
    2. if(autoflag!=null&&!"".equals(autoflag)){
    3. String tokenId= UUID.randomUUID().toString();
    4. Cookie c=new Cookie("tokenId",tokenId);
    5. c.setMaxAge(60);//cookie在浏览器的存活时间,秒为单位,时间应与后面一致
    6. resp.addCookie(c);//传递令牌
    7. Token token=new Token(tokenId,user,req.getRemoteAddr(),
    8. System.currentTimeMillis(),
    9. System.currentTimeMillis()+1000L*20);//七天就是加上1000L*60*60*24*7
    10. //req.getRemoteAddr();可以获得局域网ip,广域网使用代理后还要其他方式获得
    11. //token在服务器中如何存储?
    12. //request和session都不行,数据库则有些浪费空间影响效率
    13. //application(服务器运行期缓存),redis缓存中
    14. req.getServletContext().setAttribute(tokenId,token);
    15. }

    **