我正在使用以下技术开展项目:
当我在tomcat服务器上部署它时,我"JSESSIONID 456jghd787aa"在URL的末尾添加了一个.
我试图解决这个问题,但我无法做到这一点.
使用Tomcat 7 --- Primefaces 3.4.1 --- javax面2.1.17 --- prettyfaces-jsf2 3.3.3
我正确地在我的项目上配置了漂亮的面孔,但是我的网页过滤器没有使用由漂亮的面孔编写的新网址.
这是一个示例pretty-config.xml
<url-mapping id="home">
<pattern value="/home"/>
<view-id value="/secure/homepage.xhtml"/>
</url-mapping>
<url-mapping id="register">
<pattern value="/register"/>
<view-id value="/public/register.xhtml"/>
</url-mapping>
<url-mapping id="welcome">
<pattern value="/"/>
<view-id value="/public/welcome.xhtml"/>
</url-mapping>
<url-mapping id="profile">
<pattern value="/profile/#{userId}"/>
<view-id value="/profile.xhtml"/>
</url-mapping>
Run Code Online (Sandbox Code Playgroud)
登录(欢迎)和注册页面位于"公共"文件夹中,其Web过滤器使用注释定义:@WebFilter("/ public/*")
对于我在"安全"文件夹中的主页(确切地说文件夹中会有更多页面),我还定义了一个Web过滤器及其注释:@WebFilter("/ secure/*)
漂亮的网址工作正常,但这些过滤器只在我写原始网址时才有效.
1)我如何修复我的网络过滤器?
2)我还想阻止用户输入原始网址.我知道漂亮的面孔完全隐藏了原始网址但是有办法吗?
- 已解决 - 感谢BalusC
如果您使用注释定义了过滤器,则可以配置调度程序设置,例如
@WebFilter(URL模式= "/公共/*", dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD} )
假设以下应用程序格局:
+-----------------+
| App server |
+-----------------+
| | +-------+
| ear1 | | |
| +-web1 (/ctx1) +--<-- http://localhost/ctx1/xxx/ --+ +--<-- http://www.example.com/xxx/
| | | |
| | | proxy |
| ear2 | | |
| +-web2 (/ctx2) +--<-- http://localhost/ctx2/yyy/ --+ +--<-- http://abc.example.com/yyy/
| | | |
+-----------------+ +-------+
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,代理(nginx在我的情况下)是将请求转发到单个应用程序服务器实例,而后者又有多个具有不同上下文路径的Web模块.当然我不希望我的公共服务器暴露内部上下文根和代理它的工作做得好,包装和解包http请求等.但仍然有一个大问题:JSF生成的HTML代码(链接,css,js资源,表单动作)包含上下文路径,/ctx1并/ctx2在我的情况.这就是我想要避免的.
除了使用越来越多不同的应用服务器实例(域)之外,我现在没有解决方案,导致我的硬件资源逐渐消失.据我了解,我需要扩展我的JSF应用程序与一些可能已注册的包装器faces-config.xml,这将删除生成的html中的上下文前缀.还欢迎任何其他解决方案.
请指出我正确的方向.
我是JSF和PrettyFaces的新手.所以到现在为止我发现我可以配置PrettyFaces将请求"转发"到正确的.xhtml文件.问题是,我(或用户,如果他知道我的文件夹结构)也可以请求该文件.这是我的样本:
文件:webbapp/mypage.xhtml
我在pretty-config.xml中添加了以下行:
<url-mapping id="myPageId">
<pattern value="/prettyurltomypage" />
<view-id value="/mypage.xhtml" />
</url-mapping>
Run Code Online (Sandbox Code Playgroud)
PrettyFaces过滤器配置为拦截"/ ".Faces Front Controller配置为处理所有" .xhtml"请求.当我要求......
http://localhost:8080/myapp/prettyurltomypage
Run Code Online (Sandbox Code Playgroud)
......一切都很好.我的问题是,我也可以要求......
http://localhost:8080/myapp/mypage.xhtml
Run Code Online (Sandbox Code Playgroud)
我如何限制.xhtml请求?我的目标是让jsf/server提供默认的404页面.
我的解决方案(到目前为止)是在pretty-config.xml中定义重写规则:
<rewrite match="/mypage.xhtml" substitute="/prettyurltomypage" redirect="301" />
Run Code Online (Sandbox Code Playgroud)
还有其他(更智能)的方式吗?
我在JSF应用程序中使用PrettyFaces.该站点需要身份验证才能访问某些页面,因此我正在使用一个侦听器(预呈现视图)来检查用户是否已登录.因此,如果用户尝试访问/ foo(在PrettyFaces之前的/foo.jsf),我会重定向登录.
但是,我想将它们重定向到它们的初始目的地,所以我想附加一个请求参数"next",以便我将用户重定向到/ login?next =/foo.不幸的是,我无法从请求对象获取原始requestURI,以下代码中的uri字符串是/appname/foo.jsf而不是/ appname/foo
ctx = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) ctx.getRequest();
String uri = request.getRequestURI();
Run Code Online (Sandbox Code Playgroud)
有没有办法检索原始URI路径?
使用JSF在Java EE中开发Web应用程序.通过身份验证表单查看所有页面,并使用操作'j_security_check'并输入'j_username'和'j_password'.
但是,在成功登录后,我被重定向到我想要访问的页面,而不是该URL
/faces/javax.faces.resource/jsf.js?ln=javax.faces&stage=Development
Run Code Online (Sandbox Code Playgroud)
所以我正在查看脚本文件jsf.js,其中包含所有JS代码,而不是我想要查看的页面.如果我访问Web根目录或任何其他页面并不重要,我每次都会被重定向到此URL.然后我将URL更改为任何页面,它加载它很好,我登录.
我不得不说我已经遇到了这个神奇地消失的问题所以它正确地重定向了我.几个星期后,它再次被打破,但如果这是我的错,我不会,如果是,我不知道原因.我根本没有搞乱重定向或导航规则.
很高兴提到我也在使用PrettyFaces.
编辑:
<security-constraint>
<display-name>secured</display-name>
<web-resource-collection>
<web-resource-name>all</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>admin</role-name>
<role-name>teacher</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>secured for admins</display-name>
<web-resource-collection>
<web-resource-name>admin pages</web-resource-name>
<description/>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>unsecured</display-name>
<web-resource-collection>
<web-resource-name>css</web-resource-name>
<description/>
<url-pattern>/css/*</url-pattern>
</web-resource-collection>
<web-resource-collection>
<web-resource-name>js</web-resource-name>
<description/>
<url-pattern>/js/*</url-pattern>
</web-resource-collection>
<web-resource-collection>
<web-resource-name>img</web-resource-name>
<description/>
<url-pattern>/img/*</url-pattern>
</web-resource-collection>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>wetk-security</realm-name>
<form-login-config>
<form-login-page>/faces/login.xhtml</form-login-page>
<form-error-page>/faces/login.xhtml</form-error-page>
</form-login-config>
</login-config>
Run Code Online (Sandbox Code Playgroud) 我们使用的是带有JSF 2.2(Mojarra 2.2.0)和PrettyFaces 2.0的Glassfish 4.0.当尝试使用h:inputFile相应的表单上传文件时enctype="multipart/form-data",只有在页面被称为directy时才会触发表单操作,但如果调用了漂亮的URL,则不会发生任何事情.许多其他问题都有一些类似的问题(例如,如何使用PrimeFaces p:fileUpload?从不调用Listener方法或UploadedFile为null),但大多数问题似乎都使用PrimeFaces并且对过滤器的顺序有困难等等.因为我们想要保持JSF方法上传文件,我想知道是否有一些我可能错过的Mojarra过滤器的配置.
在web.xml当前不包含任何过滤器规格.
jsf文件只包含此表单
<h:form enctype="multipart/form-data">
<h:inputFile value="#{fileModel.testFile}"/>
<h:commandButton value="Upload" action="#{fileModel.upload}"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
并且支持bean看起来像这样
@ApplicationScoped
@Named
public class FileModel {
private Part testFile;
public Part getTestFile() {
return testFile;
}
public void setTestFile(Part testFile) {
this.testFile = testFile;
}
public void upload() {
System.out.println("File Data: " + testFile);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,取消注释这些行pretty-config.xml会产生错误,而注释它们则不会.
<url-mapping id="fileTest">
<pattern value="/file" />
<view-id value="/view/fileTest.xhtml" />
</url-mapping>
Run Code Online (Sandbox Code Playgroud)
我有一个包含Flash横幅的Spring 2.5应用程序.我没有Flash组件的源代码,但它有硬编码到某些页面的链接,.html 我希望能够将这些.html页面重定向到现有的jsp页面.如何让Spring将几个.html页面解析为.jsp页面?
我的项目看起来像:
WebContent
|
-sample.jsp
-another.jsp
WEB-INF
|
-myapp-servlet.xml
-web.xml
Run Code Online (Sandbox Code Playgroud)
我想localhost:8080/offers.html重定向到localhost:8080/sample.jsp
我可以用Spring做到这一点吗?我已经在myapp-servlet.xml中定义了一个SimpleUrlHandlerMapping和UrlFilenameViewController,它必须继续为它已经存在的页面提供服务.
在我的web.xml中,我有
<servlet-mapping>
<servlet-name>myapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
更新
这是URL映射器.如果我添加控制器,如何返回WebContent目录中的jsp视图,因为视图解析器包含/ WEB-INF/jsp目录.
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/page1.htm">page1Controller</prop>
<prop key="/page2.htm">page2Controller</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
Run Code Online (Sandbox Code Playgroud) 我用 PrettyFaces 重写错误页面对 ah:link 不起作用,我不明白为什么。
我的链接应该重定向到login.xhtml,它应该是/Login.
发生了什么事,我错过了什么吗?
我的重写规则导航:
<navigation-rule>
<from-view-id>/pageNotFound.xhtml</from-view-id>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)
我的 web.xml 用于错误页面处理和漂亮的过滤器配置:
<error-page>
<error-code>404</error-code>
<location>/pageNotFound.xhtml</location>
</error-page>
<filter>
<filter-name>Pretty Filter</filter-name>
<filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Pretty Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
我的漂亮 config.xml:
<url-mapping id="login">
<pattern value="/Login" />
<view-id value="/login.xhtml" />
</url-mapping>
Run Code Online (Sandbox Code Playgroud)
我的 pageNotFound.xhtml:
<rich:panel style="width:50%;margin-top:100px;" header="Page Not Found.">
<h:link value="Login page" outcome="login" />
</rich:panel>
Run Code Online (Sandbox Code Playgroud) 我在使用的页面上遇到了漂亮的问题<p:fileupload>.
当我在页面上禁用PrettyFaces过滤器时,一切正常.当我把它放回去时,我可以看到webbrowser上的HTTP流量,但我的fileupload处理程序永远不会被触发.
这是代码的一些相关部分.
任何帮助,将不胜感激!
我的.xhtml
<h:form id="formImportarSNs" enctype="multipart/form-data">
<p:fieldset legend="Admin Panel">
<p:fileUpload value="#{adminPanelBean.file}" mode="simple"/>
<p:commandButton ajax="false" actionListener="#{adminPanelBean.upload}" value="confirm" />
</p:fieldset>
</h:form>
Run Code Online (Sandbox Code Playgroud)
我的backingBean
package br.sgrd.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.UploadedFile;
@ViewScoped
@ManagedBean
public class AdminPanelBean{
private UploadedFile file;
public void upload() {
if(arquivo != null) {
FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
// getters/setters/etc
}
Run Code Online (Sandbox Code Playgroud)
我的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" …Run Code Online (Sandbox Code Playgroud) prettyfaces ×10
jsf ×7
jsf-2 ×3
file-upload ×2
java ×2
java-ee ×2
primefaces ×2
spring ×2
jsf-2.2 ×1
login ×1
restriction ×1
shiro ×1
spring-mvc ×1
tomcat6 ×1