Commit 7fc0cec5 by liu_xiaoxu

添加超时登录拦截器功能;

parent 13f29b98
......@@ -9,17 +9,17 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
@Configuration
public class FilterConfig extends WebMvcConfigurerAdapter {
@Autowired
private InterceptorConfig InterceptorConfig;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自定义拦截器,添加拦截路径和排除拦截路径
//
registry.addInterceptor(InterceptorConfig).
addPathPatterns("/**").
excludePathPatterns("/refreshCodeCache","/loginFail","/login","/toGetZczlListYth","/queryAllzTreeData","/queryUnitCode","/queryTypeCode","/queryZTreeDataByName");
registry.addInterceptor(new InterceptorConfig()).
addPathPatterns("/**").
excludePathPatterns("/relogin","/reloginto","/css/**","/js/**","/img/**"
,"/refreshCodeCache","/loginFail","/login","/toGetZczlListYth",
"/queryAllzTreeData","/queryUnitCode","/queryTypeCode",
"/queryZTreeDataByName"
);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
......@@ -28,4 +28,5 @@ public class FilterConfig extends WebMvcConfigurerAdapter {
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
}
}
\ No newline at end of file
......@@ -9,44 +9,48 @@ import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Component
public class InterceptorConfig implements HandlerInterceptor {
@Value("${zhyyPath}")
private String zhyyPath;
private static final String LOGIN_URL = "/relogin";
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
Cookie[] cookies=httpServletRequest.getCookies();
boolean clientKeyFlag=false;
boolean userFlag=false;
if(cookies!=null){
for(Cookie cookie:cookies){
if("clientKey".equals(cookie.getName())){
clientKeyFlag=true;
break;
}
}
}
User user=(User)httpServletRequest.getSession().getAttribute("user");
if(user!=null){
userFlag=true;
}
boolean flag=clientKeyFlag||userFlag;
if(!flag){
httpServletResponse.sendRedirect("/loginFail");
}
return flag;
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//不是ajax请求,则直接跳转页面
HttpSession session = request.getSession(true);
//session中获取用户名信息
Object obj = (User)request.getSession().getAttribute("user");
if (obj == null || "".equals(obj.toString())) {
//如果判断是 AJAX 请求,直接设置为session超时
if(request.getHeader("x-requested-with")!=null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
//是ajax请求,则返回个消息给前台
response.setHeader("sessionstatus", "timeout");
}else{
//不是ajax请求,则直接跳转页面
//超时登录
response.sendRedirect(request.getSession().getServletContext().getContextPath() + LOGIN_URL);
return false;
}
}
return true;
}
}
......@@ -15,6 +15,7 @@ import org.apache.http.message.BasicNameValuePair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
......@@ -30,6 +31,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.cookie.Cookie;
import sun.misc.BASE64Encoder;
/**
* Created by Founder on 2018/9/3.
......@@ -205,4 +207,51 @@ public class LoginController {
public String loginFail(){
return "/loginFail";
}
@RequestMapping("/relogin")
public String relogin(HttpServletRequest request){
return "relogin";
}
@RequestMapping("/resultlogin")
public String resultlogin(HttpServletRequest request){
return "resultlogin";
}
//调用登录后台 返回resultlogin页面,登录成功即自动关闭;
@RequestMapping(value="/reloginto",method = {RequestMethod.POST, RequestMethod.GET})
public String retoHome(HttpServletRequest request, @RequestParam("username") String username, @RequestParam("password") String password, ModelMap map){
Map<String,Object> returnMap=new HashMap<>();
User user=null;
user=(User)request.getSession().getAttribute("user");
String perurl = request.getParameter("perurl");
if(user==null){//进行登录
try {
User yuser=loginService.getUserByUsername(username);
if(yuser!=null){
BASE64Encoder encoder = new BASE64Encoder();
String ypassword=encoder.encode(password.getBytes());
if(ypassword.equals(yuser.getPassword())){
user=yuser;
}
}
} catch (Exception e) {
e.printStackTrace();
map.addAttribute("state","error");
map.addAttribute("msg","登录异常!");
return "resultlogin";
}
}
if(user!=null){
request.getSession().setAttribute("user",user);//登录成功生成session
request.getSession().setAttribute("perurl",perurl);//权限url 放入session中
map.addAttribute("state","success");
map.addAttribute("msg","登陆成功!");
}else{
map.addAttribute("state","failed");
map.addAttribute("msg","用户名或密码错误!");
}
return "resultlogin";
}
}
......@@ -11,4 +11,6 @@ import org.springframework.stereotype.Component;
@Mapper
public interface LoginDao {
User getUserByUser(User user);
User queryUserByUsername(String username);
}
......@@ -7,4 +7,5 @@ import com.founder.model.User;
*/
public interface ILoginService {
User getUserByUser(User user);
User getUserByUsername(String username);
}
......@@ -21,4 +21,11 @@ public class LoginService implements ILoginService{
u = loginDao.getUserByUser(user);
return u;
}
@Override
public User getUserByUsername(String username) {
User user=null;
user=loginDao.queryUserByUsername(username);
return user;
}
}
......@@ -20,4 +20,20 @@
</select>
<select id="queryUserByUsername" resultType="com.founder.model.User" parameterType="string">
select UNITCODE as unitcode,
USERNAME as username,
PASSWORD as password,
TRUE_NAME as trueName,
IDENTITYCARD as identitycard,
SEX as sex,
BIRTHDAY as birthday,
TELEPHONE as telephone,
UNITNAME as unitname,
GRADE as grade,
POLICEMANID as policemanid,
TQYHBZ as tqyhbz from SYS_USER where 1=1
and username=#{username}
</select>
</mapper>
\ No newline at end of file
@charset "UTF-8";
/*css 初始化 */
html,
body,
ul,
li,
ol,
dl,
dd,
dt,
p,
h1,
h2,
h3,
h4,
h5,
h6,
form,
fieldset,
legend,
img {
margin: 0;
padding: 0;
font:12px/150% Arial, Verdana, "\5b8b\4f53";
font-size:12px;
}
fieldset,
img,
input,
button {
border: none;
padding: 0;
margin: 0;
outline-style: none;
}
/*清除边框外发光 */
ul,
ol {
list-style: none;
/* 清除左侧小圆点标注 */
}
input {
padding-top: 0;
padding-bottom: 0;
font-family: "SimSun", "宋体";
}
select,
input {
vertical-align: middle;
}
select,
input,
textarea {
font-size: 12px;
margin: 0;
}
textarea {
resize: none;
/*防止拖动*/
}
img {
border: 0;
vertical-align: middle;
/* 去掉图片底部默认的3像素空白缝隙*/
}
table {
border-collapse: collapse;
/* 边框合并 */
}
body {
font: 12px/150% Arial, Verdana, "\5b8b\4f53";
/* 宋体 */
color: #666;
background: #fff
}
.clearfix:before,
.clearfix:after {
content: "";
display: table;
/* 清除浮动 */
}
.clearfix:after {
clear: both;
/* 清除浮动 */
}
.clearfix {
*zoom: 1;
/*IE/7/6*/
}
a {
color: #666;
text-decoration: none;
/* 清除下划线 */
}
h1,
h2,
h3,
h4,
h5,
h6 {
text-decoration: none;
font-weight: normal;
font-size: 100%;
}
s,
i,
em {
font-style: normal;
text-decoration: none;
}
.col-red {
color: #C81623!important;
}
/*公共类*/
.w {
width: 1210px;
margin: 0 auto;
/*版心 提取 */
}
.fl {
float: left
}
.fr {
float: right
}
.al {
text-align: left
}
.ac {
text-align: center
}
.ar {
text-align: right
}
.hide {
display: none
}
.show{
display: block;
}
.sp_table td.ar{
color:#0066cc;
}
/*滚动条*/
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar
{
width: 8px; /*滚动条宽度*/
height: 8px; /*滚动条高度*/
}
/*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-track
{
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
border-radius: 10px; /*滚动条的背景区域的圆角*/
background-color: rgba(0,0,0,0.2);/*滚动条的背景颜色*/
}
/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb
{
border-radius: 10px; /*滚动条的圆角*/
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: rgba(5, 111, 111,0.7);; /*滚动条的背景颜色*/
}
/****/
html,body{height:100%;width:100%;overflow:hidden;}
.login-body{background: url(../img/bgn.jpg) no-repeat;background-size: cover;}
.login-header{width:100%;height:50px;line-height: 50px;}
.login-title{text-align: center;/* background: url(../images/title-bg.png) no-repeat center; width: 1264px;*/background-size: 62%;margin:19px auto;font-size: 28px; color: #0df4ff;font-weight: 600;}
.left-globe,.right-login{float: left;width:50%;height:100%;}
.content{width:100%;height:calc(100% - 70px);display: table;}
.title{font-size: 22px; line-height: 40px;text-align: left; margin-top: 19px;margin-left: 59px;color: #0df4ff;font-weight: 600;/* -webkit-animation: slideShine 4s linear infinite;animation: slideShine 4s linear infinite;color:#D6B436; *//* background: #0df4ff -webkit-linear-gradient(left,#de1a20,#c746ba 50%,#e0b516 90%,#f31f25) no-repeat 0 0; background-size:50% 100%; -webkit-background-clip: text;-webkit-text-fill-color: transparent; */}
.policeBadge{position: absolute;top: 234px;left: 75%;margin-left: -48.5px;height:102px;}
.title-line{height:100px;position: absolute;top:52px;left:200px;}
.globe{width:50%;animation: rotateArround 3.5s linear infinite;position: absolute;top:138px;}
.left-globe{text-align: center;position: relative;}
.right-login{position:relative;}
.login-wrap{background:url(../img/wrap.png); width: 310px;height: 320px;background-size: cover;margin: 0 auto;position: absolute;top:50%;margin-top:-160px;left:50%;margin-left:-155px;}
.namel{height:58px;line-height: 58px;text-align: center;font-size: 16px;color:#15e9ff;font-weight: 600;}
.password,.name{padding: 0 10px 0 36px;color:#fff;width:171px;height:42px;background:url(../img/input.png);background-size: cover;}
.tc{text-align: center;margin:19px 0;position: relative;}
.password::-webkit-input-placeholder,.name::-webkit-input-placeholder{
color: #fff;
}
.username-icon{background: url(../img/username.png) no-repeat;}
.password-icon{background: url(../img/password.png) no-repeat;}
.zdy-fa{position: absolute;left:50%;margin-left:-100px;color:#0df4ff;font-size: 18px;top:10px;display: inline-block;width:36px;height:36px;line-height: 36px;}
.btn-info {
color: #fff;
background-color: #5bc0de;
border-color: #46b8da;
width:217px;
}
.btn {
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: 400;
line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-image: none;
border: 1px solid transparent;
border-radius: 4px;
}
.btn-info:hover {
color: #fff;
background-color: #31b0d5;
border-color: #269abc;
}
.lines{width:100%;height:100%;position: relative;}
.dib{display: inline-block;position: absolute;}
@keyframes rotateArround {
0% {transform: rotateZ(0deg);}
100% {transform: rotateZ(360deg);}
}
@-webkit-keyframes slideShine {
0% {
background-position: 0 0;
}
100% {
background-position: 100% 100%;
}
}
\ No newline at end of file
/**
* 设置未来(全局)的AJAX请求默认选项
* 主要设置了AJAX请求遇到Session过期的情况
*/
$.ajaxSetup({
type: 'POST',
complete: function(xhr,status) {
var sessionStatus = xhr.getResponseHeader('sessionstatus');
if(sessionStatus == 'timeout') {
//var top = getTopWinow();
//var tempwindow=window.open('_blank');
var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');
if (yes) {
//tempwindow.location.href = '/relogin.jsp';
openWin( '/relogin','用户登录', '8.5','7.5');
}
}
}
});
/**
* 在页面中任何嵌套层次的窗口中获取顶层窗口
* @return 当前页面的顶层窗口对象
*/
function getTopWinow(){
var p = window;
while(p != p.parent){
p = p.parent;
}
return p;
}
//name 弹窗名字
//width 弹窗宽度(比例)
//height 弹窗高度(比例)
var myWindow;
function openWin(url, name, width, height) {
var w_percent = width ? width : 9;//如果参数未传,则取9
var h_percent = height ? height : 8;
var widths = (window.screen.availWidth) * w_percent / 10;
var heights = (window.screen.availHeight) * h_percent / 10;
var iLeft = (window.screen.availWidth - widths) / 2;
var iTop = (window.screen.availHeight - heights) / 2;
//判断是否为IE
var b_version=navigator.appVersion;
var version=b_version.split(";");
if(version[1]){
var trim_Version=version[1].replace(/[ ]/g,"");
}
if(trim_Version == 'MSIE9.0' || trim_Version == 'MSIE10.0'|| trim_Version == 'WOW64' || trim_Version == 'MSIE7.0'){//IE浏览器,直接打开
myWindow = window.open(url, name, 'scrollbars=yes,width=' + widths + ',height=' + heights + ',left=' + iLeft + ',top=' + iTop + '');
myWindow.focus();
}else{//非IE,判断窗口是否存在,若存在,则关闭当前窗口,重新打开
if(myWindow){
myWindow.close();
myWindow = null;
}
myWindow = window.open(url, name, 'scrollbars=yes,width=' + widths + ',height=' + heights + ',left=' + iLeft + ',top=' + iTop + '');
}
//弹窗名字重命名ss
var title = name;
setTimeout(function () {
myWindow.document.title = title;
}, 1000);
}
\ No newline at end of file
$(function(){
resize();
$(window).resize(function(){
resize();
})
})
window.onload=function (){
}
function resize(){
/*$(".left-globe").css({"line-height":$(".left-globe").height()+"px"});*/
}
......@@ -219,9 +219,10 @@
<%--添加水印--%>
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script type="text/javascript" src="/js/listBxqjsdzczl.js"></script>
<script id="scripturlid" src="/common/js/checkurl.js?url=${perurl}" type="text/javascript"></script>
<script id="scripturlid" src="/common/js/checkurl.js?url=${perurl}" typ
e="text/javascript"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
......@@ -128,6 +128,7 @@
<%--添加水印--%>
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
......
......@@ -196,6 +196,7 @@
<%--添加水印--%>
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
......
......@@ -199,6 +199,7 @@
<%--添加水印--%>
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
......
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登陆界面</title>
<link rel="stylesheet" href="/css/base-login.css">
<link rel="stylesheet" href="/css/font-awesome.min.css">
</head>
<body class="login-body">
<header class="login-header">
<div class="login-title"><img src="/img/title.png" /></div>
</header>
<div class="lines">
<div class="content">
<div class="left-globe">
<h1 class="title"></h1>
</div>
<div class="right-login">
<div class="login-wrap">
<h2 class="namel">用户登录</h2>
<form action="reloginto" method="post">
<p class="tc"><input type="text" placeholder="账号" name="username" class="name" autocomplete="off"/><i class="username-icon zdy-fa"></i></p>
<p class="tc"><input type="password" placeholder="密码" name="password" class="password" autocomplete="off"/><i class="password-icon zdy-fa"></i></p>
<p class="tc" style="margin-top:36px;"><input type="submit" class="btn btn-info" value="登陆"/></p>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录结果</title>
</head>
<body>
<span id="time">登录状态:"${state}"</span><br>
<script type="text/javascript" src="/easyui-window/js/jquery-1.11.3.js"></script>
<script type="text/javascript">
//定义函数myClose关闭当前窗口
function myClose(){
//将id为time的元素的内容转为整数,保存在变量n中
//var n=parseInt(time.innerHTML);
debugger;
var n=1;
n--;//将n-1
//如果n==0,关闭页面
//否则, 将n+秒钟后自动关闭,再保存回time的内容中
if(n>0){
time.innerHTML=n+"秒钟后自动关闭";
timer=setTimeout(myClose,1000);
}else{
window.location.href="about:blank";
window.close();
}
}
var timer=null;
//当页面加载后,启动周期性定时器,每个1秒执行myClose
window.onload=function(){
var state = "${state}";
if(state=="success"){
debugger;
timer=setTimeout(myClose,1000);
}
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -214,6 +214,8 @@
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
......@@ -262,6 +262,8 @@
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
......@@ -248,6 +248,7 @@
<%--添加水印--%>
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
......
......@@ -256,6 +256,8 @@
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
......@@ -275,6 +275,7 @@
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
......@@ -275,6 +275,7 @@
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
......@@ -209,6 +209,7 @@
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
......@@ -350,6 +350,7 @@
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/watermark.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script>
getIPs(function(ip){
watermark.load({ watermark_txt: "<%=truename%>"+" "+"<%=identitycard%>"+" "+"<%=unitcode%>"+" "+"<%=policeId%>"+" "+ip});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment