Struts2使用Interceptor做用户登陆检查:

1)新增一个bean: User.java

package com.my.beans;

import java.util.Date;

import org.apache.struts2.json.annotations.JSON;

public class User {

    private int userId;
private String username;
private String password;
private int age;
private Date createTime; public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
} public User(int userId, String username, String password, int age,
Date createTime) {
this.userId = userId;
this.username = username;
this.password = password;
this.age = age;
this.createTime = createTime;
} public User() {
} }

2)新增一个:CheckLoginInterceptor.java

package com.my.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.my.beans.User;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; @SuppressWarnings("serial")
public class CheckLoginInterceptor extends AbstractInterceptor { @Override
public String intercept(ActionInvocation invocation) throws Exception {
// invocation invoke result
String result = null; // get invocation proxy
ActionProxy ap = invocation.getProxy();
if (ap.getNamespace().equals("/")
&& ap.getActionName().equals("login")
&& (ap.getMethod().equals("execute") || ap.getMethod().equals("signin"))) {
result = invocation.invoke();
} else {
// check user already login
HttpSession session = ServletActionContext.getRequest().getSession();
Object userObject = session.getAttribute("USER");
User user = (User) userObject;
if (null != user) {
result = invocation.invoke();
} else {
HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
// get query string
String strQueryString = (String) request.getQueryString() != null ? "?" + request.getQueryString() : "";
// redirect URL
response.sendRedirect(request.getContextPath() + "/login?path="
+ java.net.URLEncoder.encode(request.getRequestURI() + strQueryString, "UTF-8"));
}
} // return action
return result;
}
}

3) 新建一个LoginController.java

package com.my.controller;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.my.beans.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial")
public class LoginController extends ActionSupport { private String path;
private User user; public synchronized User getUser() {
return user;
} public synchronized void setUser(User user) {
this.user = user;
} public String getPath() {
return path;
} public void setPath(String path) {
this.path = path;
} @Override
public String execute() throws Exception {
return SUCCESS;
} public String signin() throws IOException {
if (user != null) {
// check user name and password
if (user.getUsername().equals("admin") && user.getPassword().equals("admin")) {
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("USER", user);
HttpServletResponse response = ServletActionContext.getResponse();
response.sendRedirect(getPath());
}
}
return SUCCESS;
} }

4)新增一个: login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>Insert title here</title>
</head>
<body>
<s:form action="login!signin">
User name:<s:textfield name="user.username"></s:textfield><br/>
password:<s:password name="user.password"></s:password><br/>
<s:hidden name="path"></s:hidden>
<s:submit value="Login"></s:submit>
</s:form>
</body>
</html>

5)加入struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 把它设置为开发模式,发布时要设置为false -->
<constant name="struts.devMode" value="true" />
<!-- 设置在class被修改时是否热加载,发布时要设置为false -->
<constant name="struts.convention.classes.reload" value="true"/>
<!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 指定jsp文件所在的目录地址 -->
<constant name="struts.convention.result.path" value="/WEB-INF/content/" />
<!-- 用于配置包名后缀。默认为action、actions、struts-->
<!-- <constant name="struts.convention.package.locators" value="controller" /> -->
<constant name="struts.convention.action.packages" value="com.my.controller"></constant>
<!-- 用于配置类名后缀,默认为Action,设置后,Struts2只会去找这种后缀名的类做映射 -->
<constant name="struts.convention.action.suffix" value="Controller"/>
<!-- 设置即使没有@Action注释,依然创建Action映射。默认值是false。因为Convention-Plugin是约定优于配置的风格,
可以不通过注解根据预先的定义就能访问相应Action中的方法 -->
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<!-- 自定义jsp文件命名的分隔符 -->
<constant name="struts.convention.action.name.separator" value="-" />
<!-- 国际化资源文件名称 -->
<constant name="struts.custom.i18n.resources" value="i18n" />
<!-- 是否自动加载国际化资源文件 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 上传文件大小限制设置 -->
<constant name="struts.multipart.maxSize" value="-1" />
<!-- 主题,将值设置为simple,即不使用UI模板。这将不会生成额外的html标签 -->
<constant name="struts.ui.theme" value="simple" />
<!-- 编码格式 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 设置默认package -->
<constant name="struts.convention.default.parent.package" value="default"></constant> <package name="default" namespace="/" extends="json-default">
<interceptors>
<interceptor name="cacheInterceptor" class="com.my.interceptor.CacheInterceptor" />
<interceptor name="loginInterceptor" class="com.my.interceptor.CheckLoginInterceptor" />
<interceptor-stack name="cacheStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack"></interceptor-ref>
<interceptor-ref name="cacheInterceptor"></interceptor-ref>
<interceptor-ref name="loginInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="cacheStack"></default-interceptor-ref>
<default-action-ref name="index" />
<global-results>
<!-- <result name="error">/error.jsp</result> -->
<result name="json" type="json">
<!-- 是否包括父类的属性输出,默认true. -->
<!-- <param name="ignoreHierarchy">false</param> -->
<!-- 是否输出null值的属性,默认false -->
<!-- <param name="excludeNullProperties">true</param> -->
</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
</package> </struts>

关键点在于:

<interceptor-ref name="loginInterceptor"></interceptor-ref>

使用此方法可以对所有的action进行监控。

如果使用web.xml的filter做监控的话,那将会对所有的资源都会监控,比如jsp、css、js等。使用Interceptor只对action做监控即可。

Struts2 - Check Login Interceptor的更多相关文章

  1. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

  2. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  3. struts2的token interceptor

    关于struts2的token拦截器的说明 原理:struts2的token interceptor是关于重复提交的拦截器,其实现是:在form表单中加入token标签,如下: <form ac ...

  4. AMQP server localhost:5672 closed the connection. Check login credentials: Socket closed

    2016-04-13 09:23:38.755 18850 INFO oslo.messaging._drivers.impl_rabbit [req-fafc8542-9403-4b5a-89d2- ...

  5. Spring3 MVC Login Interceptor(Spring 拦截器)

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  6. Struts2学习:interceptor(拦截器)的使用

    对于需要登陆验证.权限验证等功能的网站,每一次请求,每一个action都写一段验证的代码,未免显得冗余且不易维护.struts2提供了拦截器interceptor,为这些页面提供一个切面,或者说公共组 ...

  7. struts2 拦截器 interceptor

    struts2 拦截器详解:http://struts2.group.iteye.com/group/wiki/1397-deep-into-struts2-interceptors

  8. Struts2拦截器Interceptor执行顺序理解

    invocation.invoke()方法是拦截器框架的实现核心,通过确定invocation.invoke()方法执行位置,来实现Action执行前后处理操作,在invocation.invoke( ...

  9. amqp server closed the connection. check login credentials socket closed

    rabbit, [ {default_user, <<"guest">>}, {default_pass, <<"guest" ...

随机推荐

  1. 联合与枚举 、 高级指针 、 C语言标准库(一)

    1 输入一个整数,求春夏秋冬 1.1 问题 在实际应用中,有的变量只有几种可能取值.如人的性别只有两种可能取值,星期只有七种可能取值.在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型.所谓枚举 ...

  2. Http权威指南(二)---读书笔记

    Chart4 ====连接管理==== 一.TCP连接 1.  Http和Https的网络协议栈: 2.  Http在TCP/IP传输中的位置:   3.  Http怎么利用TCP传输: 二.Http ...

  3. 定制x86 Linux系统

    /************************************************************************************* * 定制x86 Linux ...

  4. Ubuntu14.04安装配置Open vSwitch

    最近在研究学习Open vSwitch,准备在本地Ubuntu14.04机器上安装一下,并基于其创建一些KVM虚拟机,下面就简要记录下在Ubuntu14.04系统上安装Open vSwitch的过程. ...

  5. tyvj 1055 区间dp

    P1055 沙子合并 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300).每堆沙子 ...

  6. 隐马尔科夫模型(HMM)的概念

    定义隐马尔科夫模型可以用一个三元组(π,A,B)来定义:π 表示初始状态概率的向量A =(aij)(隐藏状态的)转移矩阵 P(Xit|Xj(t-1)) t-1时刻是j而t时刻是i的概率B =(bij) ...

  7. BUTTON标签和INPUT标签的区别【转】

    一句话概括主题:<button>具有<input type="button" ... >相同的作用但是在可操控性方面更加强大. HTML 4.01规范的Fo ...

  8. hdu4642 Fliping game ——博弈

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4642 refer to: http://www.cnblogs.com/jackge/archive/ ...

  9. tyvj1017 - 冗余关系 ——并查集

    题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1017 并查集 #include <cstdio> #include <cstdlib& ...

  10. HDU 5234 Happy birthday --- 三维01背包

    HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置 ...