Java 在呈现JSP之前,用户必须首先通过操作

Java 在呈现JSP之前,用户必须首先通过操作,java,jsp,struts2,Java,Jsp,Struts2,我的操作类通常会有一个action字段变量,该变量在execute()方法中被赋值: 公共类MyAction扩展了ActionSupport{ 私有静态最终长serialVersionUID=1L; 私人串动作; @凌驾 公共字符串execute()引发异常{ action=“true”; //代码在这里 回归成功; } 公共字符串getAction(){ 返回动作; } 公共void设置操作(字符串操作){ 这个动作=动作; } } 在JSP中,我检查action变量(现在作为请求传递)是否

我的操作类通常会有一个
action
字段变量,该变量在
execute()
方法中被赋值:

公共类MyAction扩展了ActionSupport{
私有静态最终长serialVersionUID=1L;
私人串动作;
@凌驾
公共字符串execute()引发异常{
action=“true”;
//代码在这里
回归成功;
}
公共字符串getAction(){
返回动作;
}
公共void设置操作(字符串操作){
这个动作=动作;
}
}
在JSP中,我检查
action
变量(现在作为请求传递)是否为
null
。如果
null
,它将重定向到action类,否则,它将继续呈现页面:


我这样做是为了确保用户在试图非法跳转到JSP时首先通过操作


它可以按预期的方式工作,但是有没有其他优雅的方法可以做到这一点?

从操作上下文中获取名称。它具有当前操作的操作映射,其中包括操作名称。您还应该知道,如果没有操作上下文,Struts标记将无法工作,但只有在JSP与映射过滤器一起使用时才能工作


操作名称:${actionName}
编辑:

阻止直接访问jsp页面的示例过滤器

公共类SimpleFilter实现过滤器{
@凌驾
public void init(FilterConfig FilterConfig)抛出ServletException{
}
@凌驾
public void doFilter(ServletRequest ServletRequest、ServletResponse ServletResponse、FilterChain FilterChain)抛出IOException、ServletException{
HttpServletRequest=(HttpServletRequest)servletRequest;
HttpServletResponse=(HttpServletResponse)servletResponse;
if(request.getRequestURI().endsWith(“.jsp”)){
DispatcherType dt=request.getDispatcherType();
if(dt==DispatcherType.FORWARD | | dt==DispatcherType.INCLUDE)
//处理调度程序结果
filterChain.doFilter(请求、响应);
其他的
sendError(404,“直接访问JSP”);
}否则{
//让我们来处理这个请求
filterChain.doFilter(请求、响应);
}
}
@凌驾
公共空间销毁(){
}
}

你做得不对。只需将jsp-s放在WEB-INF下即可。页面只能通过操作访问。重定向不是问题。@普通客户端中的ohtph不应直接请求JSP页面。服务器可以访问
WEB-INF
下的JSP页面,例如,当它们通过操作呈现时。当容器已经为您编写了代码来阻止直接访问JSP,而您所要做的就是遵循标准的最佳实践时,编写代码来阻止直接访问JSP是一个非常奇怪的想法。@AleksandrM和Dave:在使用约定插件时,仅将JSP置于WEB-INF下是行不通的,因为。相关:@ohtph如果他们在WEB-INF下,他们可以猜出他们想要的——他们无法访问它们。“正确的行动”在很大程度上取决于你实际在做什么,在我看来,如果他们已经猜到了,那么试图“帮助”他们基本上就是在引导那些最终被误导的人。嗨,罗曼克,我可以在行动之前打电话给拦截者。JSP有类似的功能吗?在呈现JSP之前,我可以调用一些东西来确保它首先通过操作?您可以调用一个过滤器。您是否也可以为此发布一个示例?经过深思熟虑,我意识到,按照前面的建议,将JSP保持在WEB-INF下是非常可维护的。当用户已经猜到JSP名称时,“帮助”他们(正如我最初的意图)只会鼓励误用(好提示)。我对这个答案投了赞成票这是我的问题。我知道我的意思(建议WEB-INF的人也知道)。然而,每当你的答案不被接受时,你似乎总是有问题。在我确认答案有效之前,我不会盲目地接受答案,不是因为我不相信解决方案,而是我希望能够证明我接受的信息。我还不能接受这个,因为我还没有在需要的时候测试过它。如果你一直威胁我,你可以无视我的问题。