【Java】JavaWeb登录检查及界⾯跳转
场景
⼀般javaweb⽹站都有⽤户登录,⽽有⼀些操作必须⽤户登录才能进⾏,常见流程:⽤户请求--》后台判断是否登录--》没登录跳转到登录界⾯,登录⽤户正常操作
解决思路
在⽤过滤器过滤请求,判断是否登录,如果未登录,返回参数跳转的登录界⾯,登录了的请求放⾏
具体实现
新建⼀个web⼯,参考:
新建⼀个LoginFilter过滤器类,继承Filter类
st.login;
2
3import java.io.IOException;
4import java.io.PrintWriter;
5import java.util.ArrayList;
6import java.util.List;
7
8import javax.servlet.Filter;
9import javax.servlet.FilterChain;
10import javax.servlet.FilterConfig;
11import javax.servlet.ServletException;
12import javax.servlet.ServletRequest;
13import javax.servlet.ServletResponse;
14import javax.servlet.http.HttpServletRequest;
15import javax.servlet.http.HttpServletResponse;
16import javax.servlet.http.HttpSession;
17
18public class LoginFilter implements Filter {
19
20public static List<String> pattenURL = new ArrayList<String>();
21
22 @Override
23public void destroy() {
24// TODO Auto-generated method stub
25
26 }
27
28 @Override
29public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
30throws IOException, ServletException {
31
32 HttpServletRequest httpRequest = (HttpServletRequest) request;
33 HttpServletResponse httpResponse = (HttpServletResponse) response;
34 HttpSession session = Session();
35// 登陆url
36 String loginUrl = ContextPath() + "/login.jsp";
app登录界面
37 String url = RequestURI().toString();
38
39// 注:在pattenURL中的全部不拦截 url.indexOf(urlStr) > -1 表⽰urlStr在url中出现过,出现就不拦截
40for (String urlStr : pattenURL) {
41if (url.indexOf(urlStr) > -1) {
42 chain.doFilter(request, response);
43return;
44 }
45 }
46
47//超时处理,ajax请求超时设置超时状态,页⾯请求超时则返回提⽰并重定向,Attribute("")是获取到登录⼈的session信息
48if (Attribute("") == null) {
49// 判断是否为ajax请求
50if (Header("x-requested-with") != null
51 && Header("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
52 httpResponse.addHeader("sessionstatus", "timeOut"); // 返回超时标识
53 httpResponse.addHeader("loginPath", loginUrl);// 返回url
54 chain.doFilter(request, response);// 不可少,否则请求会出错
55 } else {
56// alert('会话过期,请重新登录');
57 String str = "<script language='javascript'>" + "p.location.href='" + loginUrl + "';</script>";
58 response.setContentType("text/html;charset=UTF-8");// 解决中⽂乱码
59try {
60 PrintWriter writer = Writer();
61 writer.write(str);
62 writer.flush();
63 writer.close();
64 } catch (Exception e) {
65 e.printStackTrace();
66 }
67 }
68 } else {
69 chain.doFilter(request, response);
70 }
71 }
72
73/**
74 * 过滤器初始化调⽤⽅法在pattenURL中的全部不拦截,所以上⾯会使⽤:path.indexOf(urlStr) > -1
75*/
76 @Override
77public void init(FilterConfig config) throws ServletException {
78 pattenURL.add("login.jsp");// 登录jsp
79 pattenURL.add("login.do");// 登录⽅法
80 pattenURL.add("css");// css
81 pattenURL.add("image");// image
82 pattenURL.add("js");// js
83 pattenURL.add("fonts");// fonts
84
85 }
86
87 }
在l中注册过滤器
1<?xml version="1.0" encoding="UTF-8"?>
2<web-app version="3.0" xmlns="java.sun/xml/ns/javaee"
3 xmlns:xsi="/2001/XMLSchema-instance"
4 xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_3_0.xsd">
5
6<display-name>test-login</display-name>
7
8<!-- 登录过滤器 -->
9<filter>
10<description>登录过滤器</description>
11<filter-name>loginFilter</filter-name>
12<filter-class&st.login.LoginFilter</filter-class>
13</filter>
14<filter-mapping>
15<filter-name>loginFilter</filter-name>
16<url-pattern>/*</url-pattern>
17</filter-mapping>
18
19<welcome-file-list>
20<welcome-file>index.jsp</welcome-file>
21</welcome-file-list>
22
23</web-app>
引⼊⼀个全局的js。⽤户控制ajax请求,如果是ajax请求的话,跳转到登录界⾯。js代码主要是真对所
有ajax请求进⾏跳转的,所以如果有的ajax不想被过滤拦截,则只需要写上:global:false即可不被拦截到
1/*
2 * 说明:此处是调⽤ajax⽅法时,判断session是否过期
3 *
4 * 注:如果不想让ajax⽅法受这个影响,可以在ajax⽅法中写: global:false
5 * 如下:
6 * $.ajax({
7 * url:"test.html",
8 * global:false //不触发全局ajax事件
9 * })
10 *
11 * **/
12
13 $(document).ajaxComplete(function(event, xhr, settings) {
ResponseHeader("sessionstatus")=="timeOut"){
ResponseHeader("loginPath")){
16 alert("登录过期,请重新登录...");
17 ResponseHeader("loginPath"));
18 }else{
19//alert("请求超时请重新登陆 !");
20 }
21 }
22 });
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论