【Java】JavaWeb 登录检查及界面跳转
场景
一般javaweb网站都有用户登录,而有一些操作必须用户登录才能进行,常见流程:用户请求--》后台判断是否登录--》没登录跳转到登录界面,登录用户正常操作
解决思路
在用过滤器过滤请求,判断是否登录,如果未登录,返回参数跳转的登录界面,登录了的请求放行
具体实现
- 新建一个web工,参考:【Maven】Eclipse 使用Maven创建Java Web项目
- 新建一个LoginFilter过滤器类,继承Filter类
package com.test.login; import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List; 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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class LoginFilter implements Filter { public static List<String> pattenURL = new ArrayList<String>(); @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession session = httpRequest.getSession();
// 登陆url
String loginUrl = httpRequest.getContextPath() + "/login.jsp";
String url = httpRequest.getRequestURI().toString(); // 注:在pattenURL中的全部不拦截 url.indexOf(urlStr) > -1 表示urlStr在url中出现过,出现就不拦截
for (String urlStr : pattenURL) {
if (url.indexOf(urlStr) > -1) {
chain.doFilter(request, response);
return;
}
} //超时处理,ajax请求超时设置超时状态,页面请求超时则返回提示并重定向,session.getAttribute("")是获取到登录人的session信息
if (session.getAttribute("") == null) {
// 判断是否为ajax请求
if (httpRequest.getHeader("x-requested-with") != null
&& httpRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
httpResponse.addHeader("sessionstatus", "timeOut"); // 返回超时标识
httpResponse.addHeader("loginPath", loginUrl);// 返回url
chain.doFilter(request, response);// 不可少,否则请求会出错
} else {
// alert('会话过期,请重新登录');
String str = "<script language='javascript'>" + "window.top.location.href='" + loginUrl + "';</script>";
response.setContentType("text/html;charset=UTF-8");// 解决中文乱码
try {
PrintWriter writer = response.getWriter();
writer.write(str);
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
chain.doFilter(request, response);
}
} /**
* 过滤器初始化调用方法 在pattenURL中的全部不拦截,所以上面会使用:path.indexOf(urlStr) > -1
*/
@Override
public void init(FilterConfig config) throws ServletException {
pattenURL.add("login.jsp");// 登录jsp
pattenURL.add("login.do");// 登录方法
pattenURL.add("css");// css
pattenURL.add("image");// image
pattenURL.add("js");// js
pattenURL.add("fonts");// fonts } } - 在web.xml中注册过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>test-login</display-name> <!-- 登录过滤器 -->
<filter>
<description>登录过滤器</description>
<filter-name>loginFilter</filter-name>
<filter-class>com.test.login.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> </web-app> - 引入一个全局的js。用户控制ajax请求,如果是ajax请求的话,跳转到登录界面。js代码主要是真对所有ajax请求进行跳转的,所以如果有的ajax不想被过滤拦截,则只需要写上:global:false即可不被拦截到
/*
* 说明:此处是调用ajax方法时,判断session是否过期
*
* 注:如果不想让ajax方法受这个影响,可以在ajax方法中写: global:false
* 如下:
* $.ajax({
* url:"test.html",
* global:false //不触发全局ajax事件
* })
*
* **/
$(document).ajaxComplete(function(event, xhr, settings) {
if(xhr.getResponseHeader("sessionstatus")=="timeOut"){
if(xhr.getResponseHeader("loginPath")){
alert("登录过期,请重新登录...");
window.location.replace(xhr.getResponseHeader("loginPath"));
}else{
//alert("请求超时请重新登陆 !");
}
}
});
【Java】JavaWeb 登录检查及界面跳转的更多相关文章
- springMVC 拦截器如何做登录检查及页面跳转
一个非常简单的登录权限拦截器 问题一:登录页面的提交请求肯定是要过滤掉的,目前采用在xml里配置<mvc:mapping path="/supplier/*"/>来过滤 ...
- Java Web登录界面
非常激动的开通了我的第一个博客,在这里希望大家能多多指点,相互学习. 一个简单的登录界面 首先我们先把这个登录分为三块: 一.数据库 数据库我用的是MYSQL: 二.前端 三.后台 1. 后台代码的 ...
- java web登录界面 源代码
大概流程: 在java web项目中 导入sqljdbc4的包 在java Resources中完成java代码 在webContent 下建立一个存放自己写jsp的文件夹 将sqljdbc4和jst ...
- java 自动登录代码
javaBean的代码 package bean; import java.io.Serializable; public class Admin implements Serial ...
- angular利用ui-router登录检查
angular利用ui-router登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检查登 ...
- java单点登录原理与简单实现
一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关 ...
- angular中的 登录检查 和 过期Session清理
angular利用ui-router进行登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检 ...
- 【struts2】自定义登录检查拦截器
在实际开发中,一个常见的功能要求是:有很多操作都需要登录后才能操作,如果操作的时候还没有登录,那么通常情况下会要求跳转回到登录页面. 1)如何实现这样的功能呢? 在具体实现之前,先来考虑几个问题: ( ...
- 界面跳转+信息传递+AS中如何将ADV转移到其他盘中
今日所学:界面跳转 信息传递 遇到的问题: 昨天遇到不能新建java类,在网上百度了很多,大多原因是没有新建java类的模板,但是我有,换了一个新的新建的方式后,发现虽然能建立了,但在测试时还是不能页 ...
随机推荐
- Centos 7 下 LAMP 部署
一.介绍 LAMP is a combination of operating system and open-source software stack. The acronym of LAMP i ...
- 非常棒的轨迹插件Better Trails v1.4.6
点击下载
- c中堆栈的理解
一直对堆栈的使用以及全局变量.静态全局变量.局部变量.静态局部变量.初始化的全局变量.未初始化的全局变量.初始化的局部变量.未初始化的局部变量理解的不是很清楚,今天抽个时间来总结以下这方面的知识: 1 ...
- VCSA 6.5, 初始化设置root密码失败can't set root password 或 安装时卡在80%
是因为下载的非官方的包密码过期了,如果是Windows引导安装: 安装完虚拟机的时候就马上执行下面步骤,修改密码有效期即可. 重启vcsa,在引导界面(photon的图形界面)里按e编辑启动项 在co ...
- TZOJ 3315 买火车票(线段树区间最小值)
描述 Byteotian州铁道部决定赶上时代,为此他们引进了城市联网.假设城市联网顺次连接着n 个市从1 到n 编号(起始城市编号为1,终止城市编号为n).每辆火车有m个座位且在任何两个运送更多的乘客 ...
- bbs项目中的零碎点记录
一.切换django的语言 在settings中修改django默认的语言 # LANGUAGE_CODE = 'en-us' # 切换django的语言,默认是英语的,我们把他修改为中文 LANGU ...
- Runnable如何传参
private class TimerUpdateTask implements Runnable{ private boolean isUnion = false; public TimerUpda ...
- python requests的content和text方法的区别(转)
原文地址: http://blog.csdn.net/xie_0723/article/details/51361006 问题: 一直在想requests的content和text属性的区别,从pri ...
- JSP使用sessionScope获取session值
场景:有些实体对象可以放到HttpSession对象中,保正在一个会话期间可以随时获取这个对象的属性,例如可以将登录用户的信息写入session,以保证页面随时可以获取并显示这个用户的状态信息.下面以 ...
- gearman中worker常驻后台,导致MySQL server has gone away
产生这个原因主要有如下几点: 1.mysql服务宕机了 2.长时间没有操作,超过了wait_timeout的设置,mysql自动断开 3.mysql请求链接被主动kill 4.发送的请求或返回结果过大 ...