struts2拦截问题对大家有些帮助

caleb_520 2010-06-28
例如,做一个登录验证的拦截器。只有用户在登录页面login.jsp提交正确的信息,才能看见view.jsp页面。

(1)触发登录的Action名称为:login.action
(2)触发查看view.jsp页面的Action名称为:view.action

那么我们在使用的时候一般会这样子做:
(1)先登录在看view.jsp
(2)如果不登录,用户输入http://localhost:8888/ssh/view.action,那么会让拦截器进行拦截,然后拦截器则会转向到login.jsp页面,让用户登录才行


但是,有一种情况拦截器不会起作用,就是你先登录成功,然后在地址栏中输入触发查看view.jsp页面的view.action,如:http://localhost:8888/ssh/view.action,你们会发现拦截器又直接调转到登录页面,程序根本不会查看到view.jsp中的信息

希望大家一起来讨论这个问题。个人觉得刚开始接触struts2的有比较好的帮助,thanks
wolferill 2010-06-30
会出现这种情况吗?

拦截器中的拦截条件是怎样的呢?

个人觉得登录后给session中加一个标识,拦截器就根据这个标识判断用户是否已登录,登录了就继续,没登陆就转到登录页面。

而且在地址栏输入和直接点击链接有区别吗?
caleb_520 2010-06-30
就“wolferill”提问,我将我的xml配置文件给出

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<constant name="struts.i18n.encoding" value="GBK"></constant>
	<package name="filedownload" extends="struts-default" namespace="/filedownload">
	
		<interceptors>
			<interceptor name="authority" class="com.gxa.edu.interceptor.AuthorityInterceptor"></interceptor>
		</interceptors>
	
		<action name="fileList" class="com.gxa.edu.action.FileDownloadAction"
			method="fileList">
			<result name="success">/ch2/download.jsp</result>
		</action>
		
		<action name="download" class="com.gxa.edu.action.FileDownloadAction"
			method="download">
			<result name="fail">/ch1/index.html</result>
			<result name="success" type="stream">
				<param name="contentType">application/x-download</param>
				<!-- inputName指定了Action中有个属性名称为fileStream,其类型为InputStream -->
				<param name="inputName">inputStream</param>
				<!-- 定义下载文件的名称 -->
				<param name="contentDisposition">attachment;filename=${fileContentDisposition}</param>
				<param name="bufferSize">4096</param>
			</result>
			
			<interceptor-ref name="authority" />
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>
	</package>
</struts>


该配置文件的作用是当用户需要下载资源的时候,拦截器会先判断该用户是否登录。

拦截器的代码如下:
package com.gxa.edu.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorityInterceptor extends AbstractInterceptor{

	private static final long serialVersionUID = 8467964417422830310L;

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		// TODO Auto-generated method stub
		ActionContext ac = arg0.getInvocationContext();
		Map session = ac.getSession();
		String user = (String) session.get("username");
		
		System.out.println("======== authorityInterceptor =========");
		
		if (user != null && !user.equals("")) {
			return arg0.invoke();
		}
		return "fail";
	}

}


请注意,我在测试我的程序的时候。

第1次点击下载超链接,拦截器会正常执行进行拦截,然后拦截器会给没有登录用户将页面跳转到登录页面。

第2次再进入下载资源的页面,点击下载超链接又让拦截器把页面转向到登录页面。非常奇怪。按照常理来说现在用户已经登录了,就可以下载资源了。
zivpiggy 2010-07-01
那只可能第二次点超链接,session是空的,打印看下。我也感觉正常情况下不会出现这问题。
caleb_520 2010-07-01
zivpiggy 写道
那只可能第二次点超链接,session是空的,打印看下。我也感觉正常情况下不会出现这问题。


session不为空了

yangfuchao418 2010-07-01
一步步调试,看看有何不同。绝对不会出现这种情况的。
wolferill 2010-07-05
个人对此问题的分析如下:

首先,应该不是Action的问题,应该是拦截器或者jsp的问题

其次,不知是不是拦截器代码的问题,打印sesion的值出来看看,username有没有空(直接看上去貌似配置也没错误)

再次,检查下是不是页面跳转几次之后,网页中Action的相对路径出错了(感觉这种可能性应该不大)

最后,说老实话,最好的方法还是单步执行一下,看看是哪里的参数出了问题吧



其实,我自己也试了下,应该没问题才对~
我拦截器的写法和你有点不同:

第一、传说中Interceptor()方法里边一定要有一个参数invocation,不过我改成了你的arg0好像也正常;

第二、我之前获取session的方法是 Map session=ActionContext.getContext().getSession();  不过好像换成你的也没问题


我是在自己之前的一个练习程序上改的,好像没找出问题来,要是楼主找出答案了,麻烦告知一下~~~
lsf171028 2010-07-06
之前获取session的方法是 Map session=ActionContext.getContext().getSession();  不过好像换成你的也没问题 
Global site tag (gtag.js) - Google Analytics