我正在寻找一种在Jersey中启用基于令牌的身份验证的方法.我试图不使用任何特定的框架.那可能吗?
我的计划是:用户注册我的Web服务,我的Web服务生成令牌,将其发送到客户端,客户端将保留它.然后,对于每个请求,客户端将发送令牌而不是用户名和密码.
我在考虑为每个请求使用自定义过滤器,@PreAuthorize("hasRole('ROLE')")
但我只是认为这会导致很多请求数据库检查令牌是否有效.
或者不创建过滤器并在每个请求中放置一个参数令牌?这样每个API首先检查令牌,然后执行一些东西来检索资源.
我在Tomcat 8.5.11中运行Jersey API时收到以下错误,导致我的API停止:
HTTP状态500 - Servlet的Servlet.init()Jersey REST服务引发异常
类型异常报告
消息Servlet.init()for servlet Jersey REST Service抛出异常
description服务器遇到内部错误,导致无法完成此请求.
例外
javax.servlet.ServletException:servlet的Servlet.init()Jersey REST服务引发了异常org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve. java:79)org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)org.apache.coyote.http11.Http11Processor. service(Http11Processor.java:783)org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:798)org.apache.tomcat.util. net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1434)org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)org.apa che.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)
根本原因
java.lang.IllegalStateException:找不到InjectionManagerFactory.org.glassfish.jersey.internal.inject.Injections.lookupInjectionManagerFactory(Injections.java:97)org.glassfish.jersey.internal.inject.Injections.createInjectionManager(Injections.java:89)org.glassfish.jersey.server.ApplicationHandler. (ApplicationHandler.java:282)org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:335)org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:178)org.glassfish.jersey.servlet. ServletContainer.init(ServletContainer.java:370)javax.servlet.GenericServlet.init(GenericServlet.java:158)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)org.apache.catalina.valves. ErrorReportValve.invoke(ErrorReportValve.java:79)org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)org.apache. coyote.http11.Http11Processor.service(Http11Processor.java:783)org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66)org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:798)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1434)org.apache .tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617 )org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)
使用gradle构建具有以下依赖项的应用程序:
dependencies {
compile (
// REST
"org.glassfish.jersey.containers:jersey-container-servlet:2.+",
"javax.servlet:javax.servlet-api:4.+",
// REST Token
"org.bitbucket.b_c:jose4j:0.+",
// MongoDB
"org.hibernate.ogm:hibernate-ogm-bom:5.+",
"org.hibernate.ogm:hibernate-ogm-infinispan:5.+",
"org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.+",
"org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.+",
"org.jboss.narayana.jta:narayana-jta:5.+",
"org.jboss:jboss-transaction-spi:7.+",
"log4j:log4j:1.+",
"org.hibernate.ogm:hibernate-ogm-mongodb:5.+",
"org.bouncycastle:bcprov-jdk15on:1.+"
) }
Run Code Online (Sandbox Code Playgroud)
这下载jersey-common-2.26-b04.jar
包含缺少的类/org/glassfish/jersey/internal/inject/InjectionManagerFactory
.jar文件部署到Tomcat文件夹下WEB-INF/lib
这可能有什么不对?gradle脚本在过去几个月中使用相同的Tomcat版本.
从头开始没有任何以前的Jersey 1.x知识,我很难理解如何在我的Jersey 2.0项目中设置依赖注入.
我也明白HK2可用于Jersey 2.0,但我似乎无法找到有助于Jersey 2.0集成的文档.
@ManagedBean
@Path("myresource")
public class MyResource {
@Inject
MyService myService;
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/getit")
public String getIt() {
return "Got it {" + myService + "}";
}
}
@Resource
@ManagedBean
public class MyService {
void serviceCall() {
System.out.print("Service calls");
}
}
Run Code Online (Sandbox Code Playgroud)
的pom.xml …
我正在尝试使用Jersey + Google应用引擎构建一个简单的hello world应用程序两天.对于简单的AppEngine项目,我遵循了这些教程,两者都很好用 https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform
但现在我正在尝试添加Jersey并遵循本教程http://www.vogella.com/articles/REST/article.html.
但服务器一直在给我
java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer
当我在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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>TestServer</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.test.myproject</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
我已经JAX-RS 2.1 RI bundle
从这里下载了Jersey ,并且已经WEB-INF/lib
在教程中添加了所有jar文件.即使两天后也没有任何效果.我已经在Google上搜索了几次,显然使用Maven的人已经解决了它,但我没有使用Maven也没有写过那个教程的人.
只是为了检查是否com.sun.jersey.spi.container.servlet.ServletContainer
存在于导入中 Jersey jars
我试图在Java中编写这个完全限定的名称并让intellisense完成名称,但我无法获得任何智能感知,com.sun.je
所以我的最后猜测是在最新的Jersey构建中有一些包重新排列并且jersey
不再在里面com.sun
.我很累,我很感激任何帮助.
我看过很多以类似的东西开头的泽西教程
@ApplicationPath("services")
public class JerseyApplication extends ResourceConfig {
public JerseyApplication() {
packages("com.abc.jersey.services");
}
}
Run Code Online (Sandbox Code Playgroud)
没有解释这个ResourceConfig
类究竟是什么.那么我在哪里可以找到它的文档,用法等?谷歌搜索"泽西资源配置"不会产生任何官方文档.
关于这个课程及其用法的一些问题是:
ResourceConfig
?ResourceConfig
某个地方的子类以便可以找到它或者它是否被泽西自动检测到?ResourceConfig
?ResourceConfig
是和web.xml
文件一样吗?如果是这样的话,如果我在我的项目中同时出现这种情 其中一个优先于另一个吗?我正在与Grizzly,Jersey和Jackson一起使用REST应用程序,因为Jersey忽略了我的自定义ObjectMapper.
POM依赖:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-servlet</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.1.4</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
结果版本是:Grizzly 2.3.3,Jackson 2.1.4和Jersey 2.2.
主类(我希望明确注册Jersey组件):
public class Main {
public static void main(String[] args) {
try {
ResourceConfig rc = new ResourceConfig();
rc.register(ExampleResource.class);
rc.register(ObjectMapperResolver.class);
HttpHandler handler = ContainerFactory.createContainer(
GrizzlyHttpContainer.class, rc);
URI uri = new URI("http://0.0.0.0:8080/");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri);
ServerConfiguration config = server.getServerConfiguration();
config.addHttpHandler(handler, "/");
server.start();
System.in.read();
} catch (ProcessingException | URISyntaxException | IOException e) {
throw new Error("Unable to create HTTP server.", e);
}
} …
Run Code Online (Sandbox Code Playgroud) 我正在使用基于Jersey的restful Service实施策略来构建将用于上传文件的服务.我的服务类名是:UploadFileService.java(参见下面的代码)
package com.jerser.service;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;
@Path("/fileUpload")
public class UploadFileService {
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail) {
String uploadedFileLocation = "d://uploaded/" + fileDetail.getFileName();
// save it
writeToFile(uploadedInputStream, uploadedFileLocation);
String output = "File uploaded to : " + uploadedFileLocation;
return Response.status(200).entity(output).build();
}
// save uploaded file to new location
private void writeToFile(InputStream …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用a ContainerRequestFilter
在基于Tomcat的Jersey应用程序上强制执行某些身份验证.我按照这个文件.问题:永远不会触发过滤器
过滤类:
@Provider
public class AuthFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
// MY AUTHENTICATION CODE GOES HERE
}
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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="debate-rest"
version="3.0">
<display-name>rest</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.hck.debate.rest.security.AuthFilter</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.hck.debate.rest.controller</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud) 我有一些使用Jersey <2.0的经验.现在我正在尝试构建一个war应用程序来提供JSON Webservice API.
我现在正在努力配置Moxy并且接缝比添加的更复杂
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)
回到Jersey <2.0的web.xml.
是否有可能只说"请添加json支持"?
目前我只是在服务器上没有任何日志条目的情况下得到很多内部服务器错误错误,只是想"我必须做一些完全错误的事情,这可不是那么难"
任何人都可以给我一个提示吗?
客户端实例是昂贵的资源.建议重新使用已配置的实例来创建Web资源.Web资源的创建,请求的构建和响应的接收都保证是线程安全的.因此,可以在多个线程之间共享Client实例和WebResource实例