初学登录拦截器小例子

2 篇文章 0 订阅
1 篇文章 0 订阅
今天是实习47天,终于把登录拦截器写好啦,作为笔记记录下(建的maven project)

1、先写好登录界面和非登录界面(即非login.action)
1)login.jsp,页面很普通,就是action需要了解,这里的action中login由约定大于配置可知对应LoginAction这个类,而loging.action对应类下loging()。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
</head>
<body>
<form action="login!loging.action">
用户名:<input type="text" name="userName" id="userName"/><br/>
密码:<input type="password" name="password" id="password"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

2)user-add.jsp
页面放在webapp/user下,对应Action放在**.web.user下(关于这些命名、放置规则可以了解struts2的convention),**.web 目录定义在struts.xml中<constant name="struts.convention.package.locators.basePackage"
value="com.cmcc.monitor.web" />
关于struts的配置可以参考我的另一篇关于拦截器原理的博客http://blog.csdn.net/jqq_apple/article/details/47421237

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<title>添加用户信息界面</title>
</head>
<body>
<form method="post" action="user!add.action"><!--UserAction下的add()方法-->
<table>
<tr>
<td>用户名:<input type="text" name="userName" id="userName"></td>
</tr>
<tr>
<td>年龄:<input type="text" name="userAge" id="userAge"></td>
</tr>
<tr>
<td>地址:<input type="text" name="userAddress" id="userAddress"></td>
</tr>
<tr>
<td><input type="submit" value="提交" style="background-color:pink"> <input type="reset" value="重置" style="background-color:red"></td> 
</tr>
</table>
</form>
</body>
</html>

3)登录成功界面,添加成功界面这里就省略了
4)LoginAction.java放在和login.jsp对应的路径上

package com.cmcc.db.web;

import java.io.IOException;
import java.util.Date;

import com.cmcc.common.bean.CommonConstants;
import com.cmcc.common.util.ParamUtil;
import com.cmcc.common.util.SpringFactory;
import com.cmcc.db.base.WebActionSupport;
import com.cmcc.db.model.Admin;
import com.cmcc.db.service.AdminService;

public class LoginAction extends WebActionSupport{

    @Override
    public String execute() {
        String returnUrl = ParamUtil.getStringParameter(request, "returnUrl", DEFAULT_RETURN_URL);
        request.setAttribute("returnUrl", returnUrl);
        return SUCCESS;

    }//给SUCCESS定义跳转到DEFAULT_RETURN_URL——设置的默认returnUrl路径

    public void loging() {
        String userName = ParamUtil.getFilteredParameter(request, "userName", 0, "");
        String password = ParamUtil.getFilteredParameter(request, "password", 0, "");

        AdminService adminService=SpringFactory.getBean(AdminService.class);

        String pwd=adminService.selectPassWByName(userName);

        Admin user = new Admin();
        user.setUserName(userName);
        user.setPassword(password);

        if(pwd.equals(password)){
            String returnUrl = ParamUtil.getStringParameter(request, "returnUrl", DEFAULT_RETURN_URL);
            request.getSession().setAttribute(CommonConstants.USER_BIND, user);
            request.setAttribute("returnUrl", returnUrl);
            try {
                response.sendRedirect(returnUrl);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

5)UserAction.java同理放在和user-add.jsp下
package com.cmcc.db.web.user;

import java.io.IOException;
import com.cmcc.common.util.ParamUtil;
import com.cmcc.common.util.SpringFactory;
import com.cmcc.db.base.WebActionSupport;
import com.cmcc.db.dao.UserDao;
import com.cmcc.db.model.User;
import com.cmcc.db.service.UserService;

public class UserAction extends WebActionSupport{

public void add(){

    String userName = ParamUtil.getFilteredParameter(request, "userName", 0, "");
    Integer userAge = Integer.parseInt(ParamUtil.getFilteredParameter(request, "userAge", 0, ""));
    String userAddress = ParamUtil.getFilteredParameter(request, "userAddress", 0, "");

    UserService userService=SpringFactory.getBean(UserService.class);

    User user=new User();

    user.setUserName(userName);
    user.setUserAge(userAge);
    user.setUserAddress(userAddress);

    userService.addUser(user);

    String returnUrl = ParamUtil.getStringParameter(request, "returnUrl", DEFAULT_RETURN_URL);
    request.setAttribute("returnUrl", returnUrl);
    try {
        response.sendRedirect(returnUrl);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}
6)WebActionSupport.java
package com.cmcc.db.base;

import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.cmcc.common.util.WebUtil;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

@Results({ @Result(name = WebActionSupport.LOGIN, location = “/login.jsp”, type = “redirect”), @Result(name = WebActionSupport.ERROR, location = “/WEB-INF/jsp/error.jsp”) })
public class WebActionSupport extends ActionSupport implements ServletRequestAware, ServletResponseAware, Preparable {

protected HttpServletRequest request;
protected HttpServletResponse response;
public static final String DEFAULT_RETURN_URL = "index.jsp";
public static final String LOIGIN = "login";
@Override
public void prepare() throws Exception {
    // TODO Auto-generated method stub
    request.setAttribute("loginReturnUrl", getEncodingURI());// /在此处设置登陆验证成功返回的url地址
}

@Override
public void setServletResponse(HttpServletResponse response) {
    this.response = response;
}

@Override
public void setServletRequest(HttpServletRequest request) {
    this.request = request;
}

public String getEncodingURI() throws Exception {
    return URLEncoder.encode(getFilteredRequestURI(request), "UTF-8");
}

public String getFilteredRequestURI(HttpServletRequest request) {
    StringBuilder sb = new StringBuilder(request.getRequestURI());
    if (request.getQueryString() != null) {
        sb.append("?").append(WebUtil.escapeParamString(request.getQueryString()));
    }
    return sb.toString();
}

}
注:其它用来和数据库连接实现登录和添加用户代码就略过了
7)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>
    <constant name="struts.convention.default.parent.package"
        value="cmcc-default" />
    <constant name="struts.convention.package.locators" value="web" />
    <constant name="struts.convention.package.locators.basePackage"
        value="com.cmcc.db.web" />
    <constant name="struts.convention.result.path" value="/WEB-INF/jsp/"/>
    <constant name="struts.i18n.encoding" value="utf-8" />
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />

    <package name="cmcc-default" extends="convention-default">
        <interceptors>
            <interceptor name="loginInter" class="com.cmcc.db.base.LoginInterceptor" />

            <interceptor-stack name="webStack">
                <interceptor-ref name="store">
                    <param name="operationMode">AUTOMATIC</param>
                </interceptor-ref>
                <interceptor-ref name="paramsPrepareParamsStack" />
                <interceptor-ref name="loginInter" />

            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name="webStack" />

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception"
                result="error" />
        </global-exception-mappings>
    </package>

    <!-- 使用Convention插件,实现约定大于配置的零配置文件风格. 特殊的Result路径在Action类中使用@Result设定. -->
</struts>

8)LoginIntercepptor.java

package com.cmcc.db.base;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.cmcc.common.bean.CommonConstants;
import com.cmcc.common.util.WebUtil;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

@SuppressWarnings("serial")
public class LoginInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {

        HttpServletRequest request = (HttpServletRequest) arg0.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
        HttpServletResponse response = (HttpServletResponse) arg0.getInvocationContext().get(ServletActionContext.HTTP_RESPONSE);

        // 继承UserActionSupport的action需要进行权限验证
        if (arg0.getAction() instanceof WebActionSupport) {
            Object o = request.getSession().getAttribute(CommonConstants.USER_BIND);
            ActionProxy proxy = arg0.getProxy();
            String actionString = proxy.getNamespace() + "/" + proxy.getActionName() + "!" + proxy.getMethod() + ".action";

            if (o == null) {
                if(actionString.startsWith("//login!loging.action")){

                    return arg0.invoke();
                }
                // Ajax调用
                if (actionString.startsWith("/user/user!list.action") || actionString.startsWith("/member/address!saveAddress.action")) {
                    //其他action
                    WebUtil.returnJSON(response, "{\"successSign\":false,\"errorMsg\":\"您尚未登录或登录已超时,请重新登录后操作\"}", "json");
                    return null;
                } else {
                    return WebActionSupport.LOIGIN;
                }
            } else{
                return arg0.invoke();
            }
        } else {
            return arg0.invoke();
        }
    }

}

9)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://java.sun.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>MYBATISTEST</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:/application*.xml</param-value>
  </context-param>
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
     <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
  </listener>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

约定大于配置
约定大于配置

笔记也好啦,要是有想要源代码的可以留言哦~啦啦啦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值