Java 在Sling中映射过滤器和servlet
我有一个要求,我对页面的请求将被拦截过滤器过滤。根据不同的条件,请求必须重定向到不同的页面 我已经创建了一个bundle,并在bundle激活器中注册了servlet和过滤器,从中得到了提示 以下是代码片段:Java 在Sling中映射过滤器和servlet,java,servlets,osgi,servlet-filters,sling,Java,Servlets,Osgi,Servlet Filters,Sling,我有一个要求,我对页面的请求将被拦截过滤器过滤。根据不同的条件,请求必须重定向到不同的页面 我已经创建了一个bundle,并在bundle激活器中注册了servlet和过滤器,从中得到了提示 以下是代码片段: Hashtable initParams = new Hashtable(); // to pass a dictionary object to // service.register initParams
Hashtable initParams = new Hashtable(); // to pass a dictionary object to
// service.register
initParams.put("sling.servlet.resourceTypes","/login");
initParams.put("sling.servlet.extensions","jsp");
service.registerServlet("/myServlet", this.myServlet, initParams, null);
initParams = new Hashtable();
initParams.put("sling.filter.scope","REQUEST");
service.registerFilter(this.checkPageRequest, "/.*",null, 2, null);
service.registerFilter(this.checkValidSession, "/.*", null, 1, null);
我面临两个问题:
checkPageRequest
过滤器将被调用,后跟checkValidSession
。如果没有requestdispatcher.forward(..)
,则将命中myServlet
servlet。在我的例子中,通过使用filterChain.doFilter(..)
,过滤器按预期被调用,但是servlet没有被调用requestdispatcher.forward(..)
时,会再次调用同一个过滤器,进入循环我将此作为OSGi捆绑包开发,以部署在DayCQ环境中。当您使用Sling时,您应该使用Sling基于SCR的标准方法来注册组件,如过滤器和servlet中所述
直接向HttpService注册Servlet和筛选器(正如您所做的那样)将与SlingMainServlet“斗争”,SlingMainServlet应该在Sling应用程序中获取所有请求。您的筛选器和Servlet应该具有相同的URL映射。当然,过滤器将首先被调用 让过滤器对数据进行预处理,让servlet在请求对象中添加数据并将其发送到JSP。参见下面的示例
@SlingFilter(order=1)
@Properties({
@Property(name="service.pid", value="com.videojet.hiresite.filters.AddNewUserFilter",propertyPrivate=false),
@Property(name="service.description",value="Preproceesing Filter", propertyPrivate=false),
@Property(name="service.vendor",value="XXX Tech", propertyPrivate=false),
@Property(name="pattern",value="/services/videojet/v1/.*", propertyPrivate=false)
// The Property Above property Maps your Filter to URL
})
public class AddNewUserFilter implements javax.servlet.Filter{
private final Logger log = LoggerFactory.getLogger(this.getClass());
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
log.info("AddNewUserFilter Invoked Invoked");
// Preprocessing here and just call chain.doFilter(xxx);
还有Servlet
@SlingServlet(
paths={"/services/videojet/v1/AddNewUserController/view","/services/videojet/v1/AddNewUserController/userExists"
,"/services/videojet/v1/AddNewUserController/addUser"}
)
@Properties({
@Property(name="service.pid", value="com.videojet.hiresite.controllers.AddNewUserController",propertyPrivate=false),
@Property(name="service.description",value="Adds new user", propertyPrivate=false),
@Property(name="service.vendor",value="XXX Tech", propertyPrivate=false)
})
public class AddNewUserController extends SlingAllMethodsServlet{
/**
* @author Oliver Kaunds
*/
///content/dam/videojetdocuments
private static final long serialVersionUID = 1L;
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Reference
protected AddNewUserService addNewUserService;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
{
log.info(":: Do GET Called ");
String path =request.getRequestURI();
log.info("PATH :: "+ path);
try{
if(path.equals("/services/videojet/v1/AddNewUserController/view"))
{
/* Do the dispatching here One Servlet can have more than one Request
Mappings . My Each mapping serves a purpose. */
List<HRRepresentative> list =addNewUserService.getHRRepresentative();
request.setAttribute("hrList",list );
HttpSession session = request.getSession();
String userOperation =(String)session.getAttribute("userOp");
request.setAttribute("userOp", userOperation);
session.removeAttribute("userOp");
//throw new Exception("My Exception");
RequestDispatcher dispatcher =request.getRequestDispatcher("/content/videojet/en/addnewuser.html"); // Dispatch to JSP here
dispatcher.forward(request, response);
}
@SlingServlet(
路径={/services/videojet/v1/AddNewUserController/view“,“/services/videojet/v1/AddNewUserController/userExists”
,“/services/videojet/v1/AddNewUserController/addUser”}
)
@性质({
@属性(name=“service.pid”,value=“com.videojet.hiresite.controllers.AddNewUserController”,propertyPrivate=false),
@属性(name=“service.description”,value=“添加新用户”,propertyPrivate=false),
@属性(name=“service.vendor”,value=“XXX Tech”,propertyPrivate=false)
})
公共类AddNewUserController扩展SlingAllMethodsServlet{
/**
*@作者奥利弗·考恩斯
*/
///内容/大坝/视频文件
私有静态最终长serialVersionUID=1L;
私有最终记录器log=LoggerFactory.getLogger(this.getClass());
@参考文献
受保护的AddNewUserService AddNewUserService;
@凌驾
受保护的void doGet(SlingHttpServletRequest请求、SlingHttpServletResponse响应)抛出ServletException、IOException
{
log.info(“::Do GET call”);
字符串路径=request.getRequestURI();
log.info(“路径::”+PATH);
试一试{
if(path.equals(“/services/videojet/v1/AddNewUserController/view”))
{
/*在这里调度一个Servlet是否可以有多个请求
映射。我的每个映射都有一个目的*/
List List=addNewUserService.getHRRepresentative();
setAttribute(“hrList”,list);
HttpSession session=request.getSession();
字符串userOperation=(字符串)session.getAttribute(“userOp”);
setAttribute(“userOp”,userOperation);
session.removeAttribute(“userOp”);
//抛出新异常(“我的异常”);
RequestDispatcher=request.getRequestDispatcher(“/content/videojet/en/addnewuser.html”);//在此处分派到JSP
转发(请求、响应);
}
这是一个经过测试的代码